package com.zzg.easypoi.util;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;

/**
 * 
 * @ClassName:  EasyPoiUtil   
 * @Description: Excle 文件导入导出Util   
 * @author: 世纪伟图 -zzg
 * @date:   2019年1月15日 上午10:49:19   
 *     
 * @Copyright: 2019 www.digipower.cn 
 * 注意：本内容仅限于深圳市世纪伟图科技开发有限公司内部使用，禁止用于其他的商业目的
 */
public class EasyPoiUtil {
	 /**
	    * 功能描述：复杂导出Excel，包括文件名以及表名。创建表头
	    *
	    * @author zzg
	    * @date 2019/01/15 10:50
	    * @param list 导出的实体类
	    * @param title 表头名称
	    * @param sheetName sheet表名
	    * @param pojoClass 映射的实体类
	    * @param isCreateHeader 是否创建表头
	    * @return 
	   */
	    public static Workbook exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, boolean isCreateHeader) {
	        ExportParams exportParams = new ExportParams(title, sheetName);
	        exportParams.setCreateHeadRows(isCreateHeader);
	        return defaultExport(list, pojoClass, exportParams);
	    }
	    
	    /**
	     * 功能描述：复杂导出Excel，包括文件名以及表名,不创建表头
	     *
	     * @author zzg
	     * @date 2019/01/15 10:51
	     * @param list 导出的实体类
	     * @param title 表头名称
	     * @param sheetName sheet表名
	     * @param pojoClass 映射的实体类
	     * @return
	     */
	    public static Workbook exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass) {
	        return defaultExport(list, pojoClass, new ExportParams(title, sheetName));
	    }
	    
	    /**
	     * 功能描述：Map 集合导出
	     *
	     * @author zzg
	     * @date 2019/01/15 10:52
	     * @param list 实体集合
	     * @return
	    */
	    public static Workbook exportExcel(List<Map<String, Object>> list) {
	    	return defaultExport(list);
	    }
	 
	    /**
	     * 功能描述：默认导出方法
	     *
	     * @author zzg
	     * @date 2019/01/15 10:53
	     * @param list 导出的实体集合
	     * @param pojoClass pojo实体
	     * @param exportParams ExportParams封装实体
	     * @return
	     */
	    private static Workbook defaultExport(List<?> list, Class<?> pojoClass,ExportParams exportParams) {
	    	return ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
	    }
	 
	    /**
	     * 功能描述：Excel导出
	     *
	     * @author zzg
	     * @date 2018/7/23 15:35
	     * @param fileName 文件名称
	     * @param response
	     * @param workbook Excel对象
	     * @return
	    */
//	    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
//	        try {
//	            response.setCharacterEncoding("UTF-8");
//	            response.setHeader("content-Type", "application/vnd.ms-excel");
//	            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//	            workbook.write(response.getOutputStream());
//	        } catch (IOException e) {
//	            throw new  RuntimeException(e);
//	        }
//	    }
	 
	    /**
	     * 功能描述：默认导出方法
	     *
	     * @author zzg
	     * @date 2018/7/23 15:33
	     * @param list 导出的实体集合
	     * @return
	    */
	    private static Workbook defaultExport(List<Map<String, Object>> list) {
	        return ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
	    }
	    
	    
	    /**
	     * 功能描述：根据文件路径来导入Excel
	     *
	     * @author zzg
	     * @date 2018/7/23 14:17 
	     * @param filePath 文件路径
	     * @param titleRows 表标题的行数
	     * @param headerRows 表头行数
	     * @param pojoClass Excel实体类
	     * @return
	    */
	    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
	        //判断文件是否存在
	        if (StringUtils.isBlank(filePath)) {
	            return null;
	        }
	        ImportParams params = new ImportParams();
	        params.setTitleRows(titleRows);
	        params.setHeadRows(headerRows);
	        List<T> list = null;
	        try {
	            list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
	        } catch (NoSuchElementException e) {
	            throw new RuntimeException("模板不能为空");
	        } catch (Exception e) {
	            e.printStackTrace();
	 
	        }
	        return list;
	    }
	 
	    /**
	     * 功能描述：根据接收的Excel文件来导入Excel,并封装成实体类
	     *
	     * @author zzg
	     * @date 2018/7/23 14:17
	     * @param file 上传的文件
	     * @param titleRows 表标题的行数
	     * @param headerRows 表头行数
	     * @param pojoClass Excel实体类
	     * @return
	     */
	    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
	        if (file == null) {
	            return null;
	        }
	        ImportParams params = new ImportParams();
	        params.setTitleRows(titleRows);
	        params.setHeadRows(headerRows);
	        List<T> list = null;
	        try {
	            list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
	        } catch (NoSuchElementException e) {
	            throw new RuntimeException("excel文件不能为空");
	        } catch (Exception e) {
	            throw new RuntimeException(e.getMessage());
	 
	        }
	        return list;
	    }
}
